home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’93 / TwilightZone / source / grafstuff.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-18  |  3.6 KB  |  180 lines  |  [TEXT/KAHL]

  1. #include <Slots.h>
  2. #include <Retrace.h>
  3.  
  4. #include "GraphicsModule_Types.h"
  5. #include "grafstuff.h"
  6.  
  7. MonitorsInfoPtr gMonitorsInfoPtr;
  8. MyDeviceDataPtr gMyDDPtr;
  9.  
  10. OSErr SetupMonitorData(void)
  11. {
  12.     GDHandle theGD;
  13.     short numGD,indexGD;
  14.     OSErr err;
  15.     
  16.     numGD = 0;
  17.     theGD = GetDeviceList();
  18.     while (theGD) {
  19.         numGD++;
  20.         theGD = GetNextDevice(theGD);
  21.     }
  22.     
  23.     gMonitorsInfoPtr = (MonitorsInfoPtr) NewPtr((numGD*sizeof(MonitorData))+sizeof(short));
  24.     if (MemError()!=noErr)
  25.         return MemError();
  26.     gMyDDPtr = (MyDeviceDataPtr) NewPtr(numGD*sizeof(MyDeviceData));
  27.     if (MemError()!=noErr)
  28.         return MemError();
  29.         
  30.     gMonitorsInfoPtr->monitorCount = numGD;
  31.     
  32.     theGD = GetDeviceList();
  33.     for (indexGD=0; indexGD<numGD; indexGD++) {
  34.         gMyDDPtr[indexGD].theGD = theGD;
  35.         gMonitorsInfoPtr->monitorList[indexGD].bounds = (**theGD).gdRect;        
  36.         gMonitorsInfoPtr->monitorList[indexGD].curDepth = GetDepth(theGD);
  37.         gMonitorsInfoPtr->monitorList[indexGD].synchFlag = false;
  38.         err = InstallMonitorVBL(theGD,&gMyDDPtr[indexGD].vbl,&gMonitorsInfoPtr->monitorList[indexGD].synchFlag);
  39.         if (err!=noErr)
  40.             return err;
  41.  
  42.         theGD = GetNextDevice(theGD);
  43.     }
  44.     
  45.     return err;
  46. }
  47.  
  48.  
  49. OSErr RemoveMonitorData(void)
  50. {
  51.     short index;
  52.     
  53.     for (index=0; index<gMonitorsInfoPtr->monitorCount; index++) {
  54.         RemoveMonitorVBL(gMyDDPtr[index].theGD,&gMyDDPtr[index].vbl);
  55.     }
  56.     
  57.     DisposePtr((Ptr)gMonitorsInfoPtr);
  58.     DisposPtr((Ptr)gMyDDPtr);
  59.     return MemError();
  60. }
  61.  
  62.  
  63. short GetDepth(GDHandle theGD)
  64. {
  65.     short compSize;
  66.     
  67.     compSize = (**(**theGD).gdPMap).cmpSize;
  68.     compSize *= (**(**theGD).gdPMap).cmpCount;
  69.     
  70.     return compSize;
  71. }
  72.  
  73.  
  74. OSErr InstallMonitorVBL(GDHandle theGD,MyTask *task,Boolean *syncFlag)
  75. {
  76.     OSErr err;
  77.     short theSlot;
  78.     long vblAddr;
  79.     unsigned short *sysVBL;
  80.     
  81.     vblAddr = (long) StripAddress((Ptr)MySyncVBL);
  82.     
  83.     err = GetSlot(theGD,&theSlot);
  84.     if (err!=noErr)
  85.         return err;
  86.  
  87.     sysVBL = (unsigned short *)NewPtrSys(6);
  88.     sysVBL[0] = 0x4ef9;
  89.     sysVBL[1] = (short) (vblAddr >> 16);
  90.     sysVBL[2] = (short) (vblAddr & 0x0000ffff);
  91.         
  92.     task->syncFlag = syncFlag;
  93.     task->theVBL.vblAddr = (ProcPtr)sysVBL;
  94.     task->theVBL.qType = vType;
  95.     task->theVBL.vblCount = 1;
  96.     task->theVBL.vblPhase = 0;
  97.     
  98.     err = SlotVInstall((QElemPtr)&task->theVBL,theSlot);
  99.     return err;
  100. }
  101.  
  102.  
  103. OSErr RemoveMonitorVBL(GDHandle theGD,MyTask *task)
  104. {
  105.     OSErr err;
  106.     short theSlot;
  107.     
  108.     err = GetSlot(theGD,&theSlot);
  109.     if (err!=noErr)
  110.         return err;
  111.     
  112.     err = SlotVRemove((QElemPtr)&task->theVBL,theSlot);
  113.     return err;
  114. }
  115.  
  116.  
  117. OSErr GetSlot(GDHandle theGD,short *theSlot)
  118. {
  119.     SpBlock spBlock;
  120.     OSErr err;
  121.     
  122.     spBlock.spCategory = 3;
  123.     spBlock.spCType = 1;
  124.     spBlock.spSlot = 0;
  125.     spBlock.spID = 0;
  126.     spBlock.spExtDev = 0;
  127.     spBlock.spTBMask = 3;    /* mask off driver */
  128.     
  129.     do {
  130.         err = SNextTypeSRsrc(&spBlock);
  131.     } while (err==noErr && spBlock.spRefNum!=(**theGD).gdRefNum);
  132.         
  133.     *theSlot = spBlock.spSlot;
  134.     return err;
  135. }
  136.  
  137.  
  138. pascal void MySyncVBL(void)
  139. {
  140.     asm {
  141.         move.w    #1,10(a0)
  142.         move.l    -4(a0),a0
  143.         st        (a0)
  144.     }
  145. }
  146.  
  147.  
  148. OSErr InitModuleQD(QDGlobalsPtr *retQD)
  149. {
  150.     QDGlobalsPtr myQD;
  151.     GrafPtr myPort;
  152.     OSErr err;
  153.     RgnHandle theRgn;
  154.     
  155.     *retQD = myQD = (QDGlobalsPtr) NewPtr(sizeof(struct QDGlobals));
  156.     if (MemError()!=noErr)
  157.         return MemError();
  158.     
  159.     GetPort(&myPort);
  160.         
  161.     BlockMove(&qd.white,&myQD->qdWhite,sizeof(Pattern));
  162.     BlockMove(&qd.black,&myQD->qdBlack,sizeof(Pattern));
  163.     BlockMove(&qd.gray,&myQD->qdGray,sizeof(Pattern));
  164.     BlockMove(&qd.ltGray,&myQD->qdLtGray,sizeof(Pattern));
  165.     BlockMove(&qd.dkGray,&myQD->qdDkGray,sizeof(Pattern));
  166.     BlockMove(&qd.arrow,&myQD->qdArrow,sizeof(Cursor));
  167.     BlockMove(&qd.screenBits,&myQD->qdScreenBits,sizeof(BitMap));
  168.     myQD->qdRandSeed = randSeed;
  169.     myQD->qdThePort = myPort;
  170. }
  171.  
  172.  
  173. OSErr DisposeModuleQD(QDGlobalsPtr modQD)
  174. {
  175.     DisposePtr((Ptr)modQD);
  176.     return MemError();
  177. }
  178.  
  179.  
  180.